package rauguelu.feria.tapas;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import rauguelu.items.Bar;
import rauguelu.items.Evento;
import rauguelu.items.Tapa;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteStatement;

public class BaseDatosFeriasHelper extends SQLiteOpenHelper {
		 
	    //La carpeta por defecto donde Android espera encontrar la Base de Datos de tu aplicaci�n
	    private static String DB_PATH = "/data/data/rauguelu.programaEventos/databases/";
	    private static String DB_NAME_FERIAS = "ferias.sqlite";
	    private SQLiteDatabase myDataBase; 
	 
	    private final Context myContext;
	 
	    /*
	     * Constructor
	     * 
	     * Guarda una referencia al contexto para acceder a la carpeta assets de la aplicaci�n y a los recursos
	     * @param contexto
	     */
	    public BaseDatosFeriasHelper(Context contexto) {
	 
	    	super(contexto, DB_NAME_FERIAS, null, 1);
	        this.myContext = contexto;
	    }	
	 
	
	    
		  /* 
		   * Crea una base de datos vac�a en el sistema y la sobreescribe con la que hemos puesto en Assets
		   */
		    public void crearDataBaseFerias() throws IOException{
		 
		    	boolean dbExist = comprobarBaseDatosFerias();
		 
		    	if(dbExist){
		    		//Si ya existe no hacemos nada
		    	}else{
		    		//Si no existe, creamos una nueva Base de datos en la carpeta por defecto de nuestra aplicaci�n, 
		    		//de esta forma el Sistema nos permitir� sobreescribirla con la que tenemos en la carpeta Assets
		        	this.getWritableDatabase();
		        	try {
		    			copiarBaseDatosFerias();
		    		} catch (IOException e) {
		        		throw new Error("Error al copiar la Base de Datos");
		        	}
		    	}
		    }
	 
		    private boolean comprobarBaseDatosFerias(){
		    	SQLiteDatabase checkDB = null;
		    	try{
		    		String myPath = DB_PATH + DB_NAME_FERIAS;
		    		checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
		    	}catch(SQLiteException e){
		    		//No existe
		    	}
		 
		    	if(checkDB != null){
		    		checkDB.close();
		    	}
		 
		    	return checkDB != null ? true : false;
		    }
		    
		    
	   
	 
	    
	    private void copiarBaseDatosFerias() throws IOException{
	   	 
	    	//Abrimos la BBDD de la carpeta Assets como un InputStream
	    	InputStream myInput = myContext.getAssets().open(DB_NAME_FERIAS);
	 
	    	//Carpeta de destino (donde hemos creado la BBDD vacia)
	    	String outFileName = DB_PATH + DB_NAME_FERIAS;
	 
	    	//Abrimos la BBDD vacia como OutputStream
	    	OutputStream myOutput = new FileOutputStream(outFileName);
	 
	    	//Transfiere los Bytes entre el Stream de entrada y el de Salida
	    	byte[] buffer = new byte[1024];
	    	int length;
	    	while ((length = myInput.read(buffer))>0){
	    		myOutput.write(buffer, 0, length);
	    	}
	 
	    	//Cerramos los ficheros abiertos
	    	myOutput.flush();
	    	myOutput.close();
	    	myInput.close();
	    }
	 
	    /*
	     * Abre la base de datos
	     */
	  
	    public void abrirBaseDatosFerias() throws SQLException{
	        String myPath = DB_PATH + DB_NAME_FERIAS;
	    	myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
	 
	    }
	 
	    /*
	     * Cierra la base de datos
	     */
	    @Override
		public synchronized void close() {
	    	    if(myDataBase != null)
	    		    myDataBase.close();
	 
	    	    super.close();
		}
	 
	    
		@Override
		public void onCreate(SQLiteDatabase db) {
			//No usamos este m�todo
		}
	 
		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			//No usamos este m�todo
		}
	 
		private final String TABLE_KEY_EVENTO = "Eventos";

		private final String TABLE_KEY_ID = "id";
		private final String TABLE_KEY_dsCategoria = "dsCategoria";
		private final String TABLE_dsEvento = "dsEvento";
		private final String TABLE_KEY_dsDescripcion = "dsDescripcion";
		private final String TABLE_KEY_cdCategoria = "cdCategoria";
		private final String TABLE_KEY_dsMarcado = "dsMarcado";
		private final String TABLE_KEY_diaEvento = "diaEvento";
		private final String TABLE_KEY_horaEvento = "horaEvento";
		private final String TABLE_KEY_dsGeo = "dsGeo";
		private final String TABLE_KEY_datoBlob = "datoBlob";
		private final String TABLE_KEY_dsWeb = "dsWeb";
		private final String TABLE_KEY_dsDatosAux = "dsDatosAux";
		
		public List<Tapa> fetchAllTapas() {
            
			List<Tapa> tapas = new ArrayList<Tapa>();
	        Cursor c =  myDataBase.query("TAPAS T,BARES B", new String[] {"T._id as _id","T.NOMBRE",
	                "T.DESCRIPCION","T.RUTA_IMAGEN","B.NOMBRE as NOMBRE_BAR" ,"FLAG_PROBADA","FLAG_VOTADA"}, "t.id_bar=b._id", null, null, null, "NOMBRE_BAR ASC");
	      //Iteramos a traves de los registros del cursor
	     	c.moveToFirst();
	     	String nombreBar = "";
	         while (c.isAfterLast() == false) {
	        	
	         	Tapa tapa = new Tapa();
	         	tapa.setIdTapa(c.getLong(0));
	         	tapa.setNombre(c.getString(1));
	         	tapa.setDescripcion(c.getString(2));
	         	tapa.setRutaImagen(c.getString(3));
	         	tapa.setNombreBar(c.getString(4));
	         	tapa.setFlagProbada(c.getString(5));
	         	tapa.setFlagVotada(c.getString(6));
	         	tapas.add(tapa);
	        	c.moveToNext();
	         }
	         c.close();
	         
	         return tapas;
	    }
		
		public Cursor fetchAllVinos() {

	        return myDataBase.query("VINOS", new String[] {"_id","NOMBRE",
	                "DESCRIPCION","RUTA_IMAGEN"}, null, null, null, null, null);
	    }
		
		public List<Bar> fetchAllBares()
		{
			List<Bar> bares = new ArrayList<Bar>();
	        Cursor c =  myDataBase.query("BARES B", new String[] {"_id as _id","NOMBRE",
	                "DESCRIPCION","LATITUD","LONGITUD","URL_WEB","RUTA_LOGO"}, null, null, null, null, null);
	      //Iteramos a traves de los registros del cursor
	     	c.moveToFirst();
	         while (c.isAfterLast() == false) {
	        	
	         	Bar bar = new Bar();
	         	bar.setId(c.getLong(0));
	         	bar.setNombre(c.getString(1));
	         	bar.setDescripcion(c.getString(2));
	         	bar.setLatitud(c.getString(3));
	         	bar.setLongitud(c.getString(4));
	         	bar.setRutaWeb(c.getString(5));
	         	bar.setUrlImagen(c.getString(6));
	         	bares.add(bar);
	        	c.moveToNext();
	         }
	         c.close();
	         
	         return bares;
		}
		public Cursor fetchTapa(long id){
			  Cursor mCursor =
					  myDataBase.query(true, "TAPAS T,BARES B", new String[] {"T._id as _id","T.NOMBRE",
				                "T.DESCRIPCION","T.RUTA_IMAGEN","B.NOMBRE as NOMBRE_BAR","FLAG_PROBADA","FLAG_VOTADA","B.RUTA_LOGO","B._id"}, "t._id" + "=" + id + " and t.id_bar=b._id", null,
			                    null, null, null, null);
			        if (mCursor != null) {
			            mCursor.moveToFirst();
			        }
			        return mCursor;
			
		}
		
		
		public Cursor fetchVino(long id){
			 Cursor mCursor =
					  myDataBase.query(true, "VINOS V", new String[] {"V._id as _id","V.NOMBRE",
				                "V.DESCRIPCION","V.RUTA_IMAGEN","V.WEB"}, "V._id" + "=" + id , null,
			                    null, null, null, null);
			        if (mCursor != null) {
			            mCursor.moveToFirst();
			        }
			        return mCursor;
		}
		
		
		public Cursor fetchBar(long id){
			 Cursor mCursor =
					  myDataBase.query(true, "BARES", new String[] {"_id as _id","NOMBRE",
				                "DESCRIPCION","LATITUD","LONGITUD","URL_WEB","RUTA_LOGO"}, "_id" + "=" + id , null,
			                    null, null, null, null);
			        if (mCursor != null) {
			            mCursor.moveToFirst();
			        }
			        return mCursor;
		}
		
		public List<Tapa> obtenerTapasBar(long idBar)
		{
			List<Tapa> tapas = new ArrayList<Tapa>();
	        Cursor c =  myDataBase.query("TAPAS T,BARES B", new String[] {"T._id as _id","T.NOMBRE",
	                "T.DESCRIPCION","T.RUTA_IMAGEN","B.NOMBRE as NOMBRE_BAR" ,"FLAG_PROBADA","FLAG_VOTADA"}, "t.id_bar=b._id and t.id_bar=" + idBar, null, null, null, "NOMBRE_BAR ASC");
	      //Iteramos a traves de los registros del cursor
	     	c.moveToFirst();
	     	String nombreBar = "";
	         while (c.isAfterLast() == false) {
	        	
	         	Tapa tapa = new Tapa();
	         	tapa.setIdTapa(c.getLong(0));
	         	tapa.setNombre(c.getString(1));
	         	tapa.setDescripcion(c.getString(2));
	         	tapa.setRutaImagen(c.getString(3));
	         	tapa.setNombreBar(c.getString(4));
	         	tapa.setFlagProbada(c.getString(5));
	         	tapa.setFlagVotada(c.getString(6));
	         	tapas.add(tapa);
	        	c.moveToNext();
	         }
	         c.close();
	         
	         return tapas;
		}
		
		public void marcaTapaProbada(Long id, String comentarios)
		{
			ContentValues args = new ContentValues();
			args.put("FLAG_PROBADA", "S");
			args.put("COMENTARIOS", comentarios);
			myDataBase.update("TAPAS", args, "_id=" + id , null);
		}
		public void desmarcaTapaProbada(Long id)
		{
			ContentValues args = new ContentValues();
			args.put("FLAG_PROBADA", "N");
			myDataBase.update("TAPAS", args, "_id=" + id , null);
		}
		
		public void marcaTapaVotada(Long id,int numeroVotos)
		{
			ContentValues args = new ContentValues();
			args.put("FLAG_VOTADA", numeroVotos);
			myDataBase.update("TAPAS", args, "_id=" + id , null);
		}
		public void desmarcaTapaVotada(Long id)
		{
			ContentValues args = new ContentValues();
			args.put("FLAG_VOTADA", "N");
			myDataBase.update("TAPAS", args, "_id=" + id , null);
		}
		
		public long getNumeroVotos()
		{
			SQLiteStatement s = myDataBase.compileStatement("select count(*) from tapas where flag_votada != 'N' ");

			long count = s.simpleQueryForLong();
			return count;
		}
		
		public String getSyncStatus()
		{
			SQLiteStatement s = myDataBase.compileStatement("SELECT VALUE FROM PROPIEDADES_DISPOSITIVO WHERE key='SYNC_SERVER' ");

			String value = s.simpleQueryForString();
			return value;
		}
		public void cambiaSyncStatus(String status)
		{
			ContentValues args = new ContentValues();
			args.put("VALUE", status);
			myDataBase.update("PROPIEDADES_DISPOSITIVO", args, "KEY='SYNC_SERVER'" , null);
		}
		
		public void syncVotos(String idTapa, int votos)
		{
			ContentValues args = new ContentValues();
			args.put("FLAG_VOTADA", votos);
			myDataBase.update("TAPAS", args, "_id=" + idTapa , null);
		}
		/*
	     * Obtiene todos los eventos desde la Base de Datos
	     */
	     public ArrayList<Evento> GetEventos(){
	     	ArrayList<Evento> listaEventos = new ArrayList<Evento>();
	     	Cursor c = myDataBase.query(TABLE_KEY_EVENTO, 
	     			new String[] {					
	     				TABLE_KEY_ID, TABLE_KEY_cdCategoria, TABLE_KEY_dsCategoria, TABLE_dsEvento,
	     				TABLE_KEY_dsDescripcion, TABLE_KEY_dsMarcado,
	     				TABLE_KEY_diaEvento, TABLE_KEY_horaEvento, TABLE_KEY_dsGeo,
	     				TABLE_KEY_datoBlob, TABLE_KEY_dsWeb, TABLE_KEY_dsDatosAux}, 
	     			null, null, null, null, null,null);
	     	
	     	//Iteramos a traves de los registros del cursor
	     	c.moveToFirst();
	         while (c.isAfterLast() == false) {
	         	Evento evento = new Evento();
	         	evento.setId(c.getString(0));
	         	evento.setCdCategoria(c.getString(1));
	         	evento.setDsCategoria(c.getString(2));
	         	evento.setDsEvento(c.getString(3));
	         	evento.setDsDescripcion(c.getString(4));
	         	evento.setDsMarcado(c.getString(5));
	         	evento.setHoraEvento(c.getString(6));
	         	evento.setDsGeo(c.getString(7));
	         	evento.setDatoBlob(c.getBlob(8));
	         	evento.setDsWeb(c.getString(9));
	         	evento.setDsDatosAux(c.getString(10));
	         	listaEventos.add(evento);
	        	    c.moveToNext();
	         }
	         c.close();
	         
	         return listaEventos;
	     }
	     
	     

		/*
	     * Obtiene todos los libros desde la Base de Datos
	     */
	     public ArrayList<Evento> GetElementosFiltrados(){
	     	ArrayList<Evento> listaEventos = new ArrayList<Evento>();
	     	
     	
	     	Cursor c = myDataBase.query(TABLE_KEY_EVENTO, 
	     			new String[] {					
	     				TABLE_KEY_ID, TABLE_KEY_cdCategoria, TABLE_KEY_dsCategoria, TABLE_dsEvento,
	     				TABLE_KEY_dsDescripcion, TABLE_KEY_dsMarcado,
	     				TABLE_KEY_diaEvento, TABLE_KEY_horaEvento, TABLE_KEY_dsGeo,
	     				TABLE_KEY_datoBlob, TABLE_KEY_dsWeb, TABLE_KEY_dsDatosAux}, 
	     			null, null, null, null, null,null);
	     	
	     	//Iteramos a traves de los registros del cursor
	     	c.moveToFirst();
	         while (c.isAfterLast() == false) {
	         	Evento evento = new Evento();
	         	evento.setId(c.getString(0));
	         	evento.setCdCategoria(c.getString(1));
	         	evento.setDsCategoria(c.getString(2));
	         	evento.setDsEvento(c.getString(3));
	         	evento.setDsDescripcion(c.getString(4));
	         	evento.setDsMarcado(c.getString(5));
	         	evento.setHoraEvento(c.getString(6));
	         	evento.setDsGeo(c.getString(7));
	         	evento.setDatoBlob(c.getBlob(8));
	         	evento.setDsWeb(c.getString(9));
	         	evento.setDsDatosAux(c.getString(10));
	         	
	         	if(evento.getDsMarcado().equals("S"))
	         		listaEventos.add(evento);
	         			
	        	    c.moveToNext();
	         }
	         c.close();
	         
	         return listaEventos;
	     }
	     
	     /*
		     * Obtiene todos los libros desde la Base de Datos
		     */
		     public int countElementos(){
		     	Cursor c = myDataBase.query(TABLE_KEY_EVENTO, 
		     			new String[] {TABLE_KEY_ID}, 
		     			null, null, null, null, null,null);
		     	
		     	//Iteramos a traves de los registros del cursor
		     	return c.getCount();
		     	
		     }
		     
		     /*
			     * Obtiene todos los libros desde la Base de Datos
			     */
			     public ArrayList<Evento> GetEventoDia(Integer cdCategoria){
			     	ArrayList<Evento> listaEventos = new ArrayList<Evento>();
			     	
			     	Cursor c = myDataBase.query(TABLE_KEY_EVENTO, 
			     			new String[] {					
			     				TABLE_KEY_ID, TABLE_KEY_cdCategoria, TABLE_KEY_dsCategoria, TABLE_dsEvento,
			     				TABLE_KEY_dsDescripcion, TABLE_KEY_dsMarcado,
			     				TABLE_KEY_diaEvento, TABLE_KEY_horaEvento, TABLE_KEY_dsGeo,
			     				TABLE_KEY_datoBlob, TABLE_KEY_dsWeb, TABLE_KEY_dsDatosAux}, 
			     			null, null, null, null, null,null);
			     	
			     	//Iteramos a traves de los registros del cursor
			     	c.moveToFirst();
			     	  while (c.isAfterLast() == false) {
			         	Evento evento = new Evento();
			         	evento.setId(c.getString(0));
			         	evento.setCdCategoria(c.getString(1));
			         	evento.setDsCategoria(c.getString(2));
			         	evento.setDsEvento(c.getString(3));
			         	evento.setDsDescripcion(c.getString(4));
			         	evento.setDsMarcado(c.getString(5));
			         	evento.setHoraEvento(c.getString(6));
			         	evento.setDsGeo(c.getString(7));
			         	evento.setDatoBlob(c.getBlob(8));
			         	evento.setDsWeb(c.getString(9));
			         	evento.setDsDatosAux(c.getString(10));
			         	
			         	if(evento.getCdCategoria().toString().equals(cdCategoria.toString()))
			         		listaEventos.add(evento);
			        	
			         	c.moveToNext();
			         }
			         c.close();
			         
			         return listaEventos;
			     }
}
